#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include <cstddef>

using ElementType = int;
class LinkList
{
public:
    LinkList();
    LinkList(const LinkList& list);
    ~LinkList();
    //尾插
    void InsertTail(const ElementType& element);
    //头插
    void InsertHead(const ElementType& element);
    //中间插入
    void InsertByIndex(int index, const ElementType& element);

    //按位置删除
    void RemoveByIndex(int index);
    //按值删除
    void RemoveByElement(const ElementType& element);

    //按位置修改
    void UpDataByIndex(int index, const ElementType& element);
    //按值修改
    void UpDataByElement(const ElementType& oldValue, const ElementType& newValue);

    //链表排序
    /*冒泡排序*/
    void BubbleSort();
    

    //归并
    LinkList Merge(const LinkList& list);


    //排序
    void Sort();

    //链表逆序
    void Reserve();
    //逆序(递归)
    void Reserve2();

    void show();

private:
    //节点
    struct Node
    {
        //节点初始化
        Node(const ElementType& value):value(value), next(nullptr){}
        //数据域
        ElementType value;
        //指针域->指针指向下一个节点所以是Node类型
        Node* next;
    };
    /*快速排序*/
    void FastSort(Node *start, Node *end);
    /*原本的尾巴开始返回*/
    //逆序递归
    Node *Reserve2(Node *node);
    Node *head; //头指针
    size_t size;  //节点个数

};

#endif